#!/bin/bash

# 手工外发小程序API文档更新脚本
# 用于自动更新docs目录下的API文档

set -e

echo "🔄 开始更新API文档..."

# 项目配置
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DOCS_DIR="${PROJECT_DIR}/docs"
SERVER_URL="http://localhost:8080"
API_DOCS_URL="${SERVER_URL}/api/api-docs"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}ℹ️  $1${NC}"
}

log_success() {
    echo -e "${GREEN}✅ $1${NC}"
}

log_warning() {
    echo -e "${YELLOW}⚠️  $1${NC}"
}

log_error() {
    echo -e "${RED}❌ $1${NC}"
}

# 检查服务是否运行
check_server() {
    log_info "检查服务状态..."
    if curl -s -f "${API_DOCS_URL}" > /dev/null; then
        log_success "服务正常运行"
        return 0
    else
        log_error "服务未运行或无法访问: ${API_DOCS_URL}"
        log_warning "请确保应用已启动: mvn spring-boot:run"
        exit 1
    fi
}

# 创建docs目录
create_docs_dir() {
    if [ ! -d "${DOCS_DIR}" ]; then
        log_info "创建docs目录..."
        mkdir -p "${DOCS_DIR}"
        log_success "docs目录创建成功"
    fi
}

# 备份现有文档
backup_docs() {
    if [ -f "${DOCS_DIR}/api-docs.json" ]; then
        log_info "备份现有文档..."
        local backup_dir="${DOCS_DIR}/backup"
        mkdir -p "${backup_dir}"
        cp "${DOCS_DIR}"/*.json "${backup_dir}/" 2>/dev/null || true
        cp "${DOCS_DIR}"/*.md "${backup_dir}/" 2>/dev/null || true
        cp "${DOCS_DIR}"/*.html "${backup_dir}/" 2>/dev/null || true
        log_success "文档备份完成"
    fi
}

# 更新JSON文档
update_json_docs() {
    log_info "更新JSON文档..."

    # 下载完整的API文档
    if curl -s "${API_DOCS_URL}" -o "${DOCS_DIR}/api-docs.json"; then
        log_success "api-docs.json 更新成功"
    else
        log_error "api-docs.json 更新失败"
        return 1
    fi

    # 创建openapi.json（与api-docs.json相同）
    cp "${DOCS_DIR}/api-docs.json" "${DOCS_DIR}/openapi.json"
    log_success "openapi.json 创建成功"
}

# 更新Markdown文档
update_markdown_doc() {
    log_info "更新Markdown文档..."

    cat > "${DOCS_DIR}/api.md" << 'EOF'
# 手工外发小程序 API 接口文档

## 接口概览

本文档描述了手工外发小程序后端服务的所有API接口。

**服务地址**: http://localhost:8080/api
**文档版本**: v1.0.0
**更新时间**: $(date '+%Y-%m-%d %H:%M:%S')

---

## 认证方式

### JWT认证

除了登录接口外，其他所有接口都需要JWT认证。

**请求头格式**:
```
Authorization: Bearer {token}
```

**获取Token**:
通过 `POST /api/users/login` 接口获取JWT Token。

---

## 统一响应格式

所有接口都返回统一的JSON格式：

```json
{
  "code": 200,
  "message": "操作成功",
  "data": "具体数据",
  "timestamp": 1672531200000
}
```

**状态码说明**:
- `200`: 操作成功
- `401`: 未授权访问
- `403`: 访问被禁止
- `500`: 服务器内部错误

---

## 接口列表

### 用户管理 (/users)

#### 1. 微信登录
- **接口**: `POST /api/users/login`
- **描述**: 使用微信授权码进行登录
- **无需认证**
- **请求参数**:
  ```json
  {
    "code": "微信授权码",
    "nickName": "用户昵称",
    "avatarUrl": "用户头像URL"
  }
  ```
- **响应**: 返回JWT Token

#### 2. 获取用户信息
- **接口**: `GET /api/users/profile`
- **描述**: 获取当前登录用户的详细信息
- **需要认证**: 是
- **响应**: 用户详细信息

#### 3. 更新用户信息
- **接口**: `PUT /api/users/profile`
- **描述**: 更新当前登录用户的信息
- **需要认证**: 是
- **请求参数**:
  ```json
  {
    "nickName": "昵称",
    "avatarUrl": "头像URL",
    "phone": "手机号",
    "address": "地址"
  }
  ```

#### 4. 获取用户统计
- **接口**: `GET /api/users/stats`
- **描述**: 获取当前登录用户的任务统计信息
- **需要认证**: 是
- **响应**: 用户统计数据

---

### 手工品管理 (/products)

#### 1. 获取手工品列表
- **接口**: `GET /api/products`
- **描述**: 根据条件查询手工品列表
- **无需认证**: 是
- **查询参数**:
  - `keyword`: 关键词搜索
  - `tags`: 标签筛选
  - `pageNum`: 页码（默认1）
  - `pageSize`: 每页数量（默认10）

#### 2. 获取手工品详情
- **接口**: `GET /api/products/{id}`
- **描述**: 根据ID获取手工品详细信息
- **无需认证**: 是
- **路径参数**: `id` - 手工品ID

#### 3. 创建手工品
- **接口**: `POST /api/products`
- **描述**: 创建新的手工品
- **需要认证**: 是
- **请求参数**:
  ```json
  {
    "name": "手工品名称",
    "description": "手工品描述",
    "price": 15.50,
    "tags": "手工,编织,饰品",
    "images": ["图片URL1", "图片URL2"]
  }
  ```

#### 4. 更新手工品
- **接口**: `PUT /api/products/{id}`
- **描述**: 更新手工品信息
- **需要认证**: 是
- **路径参数**: `id` - 手工品ID
- **请求参数**: 同创建手工品

#### 5. 上架手工品
- **接口**: `PUT /api/products/{id}/online`
- **描述**: 将手工品状态改为上架
- **需要认证**: 是
- **路径参数**: `id` - 手工品ID

#### 6. 下架手工品
- **接口**: `PUT /api/products/{id}/offline`
- **描述**: 将手工品状态改为下架
- **需要认证**: 是
- **路径参数**: `id` - 手工品ID

---

## 在线文档

- **Swagger UI**: http://localhost:8080/api/swagger-ui.html
- **OpenAPI JSON**: http://localhost:8080/api/api-docs

---

## 更新日志

### v1.0.0 ($(date '+%Y-%m-%d'))
- 初始版本发布
- 实现用户管理接口
- 实现手工品管理接口
- 集成JWT认证
- 配置Swagger文档
- 自动化文档更新
EOF

    log_success "api.md 更新成功"
}

# 更新HTML文档（从Markdown转换）
update_html_doc() {
    log_info "更新HTML文档..."

    # 简单的Markdown到HTML转换
    cat > "${DOCS_DIR}/api.html" << 'EOF'
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>手工外发小程序 API 接口文档</title>
    <style>
        body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; line-height: 1.6; color: #333; max-width: 1200px; margin: 0 auto; padding: 20px; background-color: #f8f9fa; }
        .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px; border-radius: 10px; margin-bottom: 30px; text-align: center; }
        .section { background: white; padding: 25px; margin-bottom: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        .endpoint { border-left: 4px solid #007bff; padding-left: 15px; margin: 15px 0; }
        .method { display: inline-block; padding: 4px 8px; border-radius: 4px; color: white; font-size: 12px; font-weight: bold; margin-right: 10px; }
        .get { background-color: #28a745; }
        .post { background-color: #007bff; }
        .put { background-color: #ffc107; color: #000; }
        .url { font-family: 'Courier New', monospace; background: #f1f3f4; padding: 5px 8px; border-radius: 4px; font-size: 14px; }
        .code { background: #f8f9fa; border: 1px solid #e9ecef; border-radius: 4px; padding: 15px; margin: 10px 0; font-family: 'Courier New', monospace; font-size: 13px; }
    </style>
</head>
<body>
    <div class="header">
        <h1>🎨 手工外发小程序 API 接口文档</h1>
        <p>服务地址：http://localhost:8080/api | 版本：v1.0.0 | 更新时间：$(date '+%Y-%m-%d %H:%M:%S')</p>
    </div>

    <div class="section">
        <h2>📖 在线文档</h2>
        <p><a href="http://localhost:8080/api/swagger-ui.html" target="_blank">🔗 Swagger UI 交互式文档</a></p>
    </div>

    <div class="section">
        <h2>📄 文档文件</h2>
        <ul>
            <li><a href="./api.md">📝 Markdown格式文档</a></li>
            <li><a href="./openapi.json">⚙️ OpenAPI JSON文档</a></li>
            <li><a href="./README.md">📚 文档目录说明</a></li>
        </ul>
    </div>
</body>
</html>
EOF

    log_success "api.html 更新成功"
}

# 显示更新摘要
show_summary() {
    echo ""
    log_success "🎉 API文档更新完成！"
    echo ""
    echo "📋 更新的文件："
    echo "  - docs/api.md (Markdown格式)"
    echo "  - docs/api.html (HTML格式)"
    echo "  - docs/api-docs.json (OpenAPI JSON)"
    echo "  - docs/openapi.json (标准JSON)"
    echo ""
    echo "📖 查看文档："
    echo "  - 在浏览器中打开: docs/api.html"
    echo "  - 在线交互式文档: http://localhost:8080/api/swagger-ui.html"
    echo ""
}

# 主函数
main() {
    log_info "开始执行API文档更新..."

    # 检查参数
    if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
        echo "用法: $0 [选项]"
        echo ""
        echo "选项:"
        echo "  --help, -h     显示帮助信息"
        echo "  --backup-only  仅备份现有文档"
        echo "  --no-backup   不备份现有文档"
        echo ""
        echo "示例:"
        echo "  $0                    # 完整更新文档"
        echo "  $0 --backup-only     # 仅备份文档"
        echo "  $0 --no-backup      # 更新文档但不备份"
        exit 0
    fi

    # 解析参数
    backup_only=false
    no_backup=false

    while [[ $# -gt 0 ]]; do
        case $1 in
            --backup-only)
                backup_only=true
                shift
                ;;
            --no-backup)
                no_backup=true
                shift
                ;;
            *)
                log_error "未知参数: $1"
                echo "使用 --help 查看帮助信息"
                exit 1
                ;;
        esac
    done

    # 执行步骤
    create_docs_dir

    if [ "$no_backup" != true ]; then
        backup_docs
    fi

    if [ "$backup_only" = true ]; then
        log_success "文档备份完成"
        exit 0
    fi

    check_server
    update_json_docs
    update_markdown_doc
    update_html_doc
    show_summary
}

# 执行主函数
main "$@"